Notify Errors Appropriately from SoftMPEG2 This is to ensure that the framework realises that an error has occured and does not call onQueueFilled if the error is fatal. Bug: 36715268 Change-Id: If02499d306aa9b6df64a7f25d43d1bdf318a10cd (cherry picked from commit eae3ad0585d17bab12bbd831b58407c122732a1c) 
diff --git a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp index 5ed037a..634207e 100644 --- a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp +++ b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.cpp 
@@ -68,6 +68,7 @@  kProfileLevels, ARRAY_SIZE(kProfileLevels),  320 /* width */, 240 /* height */, callbacks,  appData, component), + mCodecCtx(NULL),  mMemRecords(NULL),  mFlushOutBuffer(NULL),  mOmxColorFormat(OMX_COLOR_FormatYUV420Planar), @@ -75,6 +76,7 @@  mNewWidth(mWidth),  mNewHeight(mHeight),  mChangingResolution(false), + mSignalledError(false),  mStride(mWidth) {  initPorts(kNumBuffers, INPUT_BUF_SIZE, kNumBuffers, CODEC_MIME_TYPE);   @@ -82,11 +84,21 @@  GENERATE_FILE_NAMES();  CREATE_DUMP_FILE(mInFile);   - CHECK_EQ(initDecoder(), (status_t)OK); + if (OK != initDecoder()) { + ALOGE("Failed to initialize decoder"); + notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); + mSignalledError = true; + return; + }  }    SoftMPEG2::~SoftMPEG2() { - CHECK_EQ(deInitDecoder(), (status_t)OK); + if (OK != deInitDecoder()) { + ALOGE("Failed to deinit decoder"); + notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); + mSignalledError = true; + return; + }  }     @@ -204,6 +216,7 @@  setNumCores();    mStride = 0; + mSignalledError = false;    return OK;  } @@ -433,6 +446,7 @@    mInitNeeded = true;  mChangingResolution = false; + mCodecCtx = NULL;    return OK;  } @@ -444,10 +458,13 @@    ret = initDecoder();  if (OK != ret) { - ALOGE("Create failure"); + ALOGE("Failed to initialize decoder");  deInitDecoder(); - return NO_MEMORY; + notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); + mSignalledError = true; + return ret;  } + mSignalledError = false;  return OK;  }   @@ -586,6 +603,9 @@  void SoftMPEG2::onQueueFilled(OMX_U32 portIndex) {  UNUSED(portIndex);   + if (mSignalledError) { + return; + }  if (mOutputPortSettingsChange != NONE) {  return;  } @@ -642,7 +662,12 @@  bool portWillReset = false;  handlePortSettingsChange(&portWillReset, mNewWidth, mNewHeight);   - CHECK_EQ(reInitDecoder(), (status_t)OK); + if (OK != reInitDecoder()) { + ALOGE("Failed to reinitialize decoder"); + notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); + mSignalledError = true; + return; + }  return;  }   @@ -715,7 +740,12 @@  bool portWillReset = false;  handlePortSettingsChange(&portWillReset, s_dec_op.u4_pic_wd, s_dec_op.u4_pic_ht);   - CHECK_EQ(reInitDecoder(), (status_t)OK); + if (OK != reInitDecoder()) { + ALOGE("Failed to reinitialize decoder"); + notify(OMX_EventError, OMX_ErrorUnsupportedSetting, 0, NULL); + mSignalledError = true; + return; + }    if (setDecodeArgs(&s_dec_ip, &s_dec_op, inHeader, outHeader, timeStampIx)) {  ivdec_api_function(mCodecCtx, (void *)&s_dec_ip, (void *)&s_dec_op); 
diff --git a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h index 700ef5f..1285c5b 100644 --- a/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h +++ b/media/libstagefright/codecs/mpeg2dec/SoftMPEG2.h 
@@ -106,6 +106,7 @@  // codec. So the codec is switching to decode the new resolution.  bool mChangingResolution;  bool mFlushNeeded; + bool mSignalledError;  bool mWaitForI;  size_t mStride;